/**
 * @Author: zhangguojin
 * @Date: 2022/9/22 10:47
 * @Description: 前端校验类方法
 */

// 输入项必填
const inputRequired = (message=`请输入`)=> {
  return {
    required: true,
    message,
  }
};

// 选择项必填
const selectRequired = (message=`请选择`)=> {
  return {
    required: true,
    message,
  }
};

// 最小长度
const minLength = (min= 2)=> {
  return {
    min,
    message: `最少${min}个字符`
  }
};

// 最大长度
const maxLength = (max= 50)=> {
  return {
    max,
    message: `最多${max}个字符`
  }
};

// 只能为数字
const onlyNumber = (message=`只能为数字`)=> {
  return {
    pattern: /^\d+$/,
    message,
  }
};

// 只能为字母
const onlyLetter = (message=`只能为字母`)=> {
  return {
    pattern: /^[a-zA-Z]+$/,
    message,
  }
};

// 只能为数字、字母
const onlyNumberLetter = (message=`只能为数字、字母`)=> {
  return {
    pattern: /^[\da-zA-Z]+$/,
    message,
  }
};

// 只能为数字、字母和下划线
const onlyNumberLetterUnderline = (message=`只能为数字、字母和下划线`)=> {
  return {
    pattern: /^[\da-zA-Z_]+$/,
    message,
  }
};

// 手机号码校验
const phone = (message = `手机号码格式不正确`) => {
  return {
    pattern: /^1[3-9]\d{9}$/,
    message,
  };
};

// 身份证校验
const identityId = (validator = identityIdVerify)=> {
  return {
    validator,
  };
}
const identityIdVerify = (rule, value, callback) => {
  if(!value){
    return false;
  }
  const pattern = /(^\d{15}$)|(^\d{17}(\d|X|x)$)/; //正则
  //地区校验
  const aCity = {
    11: "北京",
    12: "天津",
    13: "河北",
    14: "山西",
    15: "内蒙古",
    21: "辽宁",
    22: "吉林",
    23: "黑龙江",
    31: "上海",
    32: "江苏",
    33: "浙江",
    34: "安徽",
    35: "福建",
    36: "江西",
    37: "山东",
    41: "河南",
    42: "湖北",
    43: "湖南",
    44: "广东",
    45: "广西",
    46: "海南",
    50: "重庆",
    51: "四川",
    52: "贵州",
    53: "云南",
    54: "西藏",
    61: "陕西",
    62: "甘肃",
    63: "青海",
    64: "宁夏",
    65: "新疆",
    71: "台湾",
    81: "香港",
    82: "澳门",
    91: "国外",
  };
  // 出生日期验证
  const sBirthday = (
    value.substr(6, 4) +
    "-" +
    Number(value.substr(10, 2)) +
    "-" +
    Number(value.substr(12, 2))
  ).replace(/-/g, "/");
  const date = new Date(sBirthday);
  // 身份证号码校验 最后4位  包括最后一位的数字/字母X
  let sum = 0,
    weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2],
    codes = "10X98765432";
  for (let i = 0; i < value.length - 1; i++) {
    sum += value[i] * weights[i];
  }
  const last = codes[sum % 11]; //计算出来的最后一位身份证号码
  if (
    value === "" ||
    !pattern.test(value) ||
    !aCity[parseInt(value.substr(0, 2))] ||
    sBirthday !==
      date.getFullYear() + "/" + (date.getMonth() + 1) + "/" + date.getDate() ||
    value[value.length - 1] !== last
  ) {
    callback(new Error(`身份证格式不正确`));
  }else {
    callback();
  }
};

// 自定义校验
const customVerify = ( pattern = ``, message = `格式不正确`) => {
  return {
    pattern,
    message,
  };
};

export {
  inputRequired,
  selectRequired,
  minLength,
  maxLength,
  onlyNumber,
  onlyLetter,
  onlyNumberLetter,
  onlyNumberLetterUnderline,
  phone,
  identityId,
  customVerify,
};
